package com.free.utils;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.free.exception.SystemException;

import java.io.IOException;
import java.util.HashMap;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class JsonUtils {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/
    private static final ObjectMapper mapper = new ObjectMapper();
    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    static {
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        JavaType StringStringMap = mapper.getTypeFactory().constructMapType(HashMap.class,String.class, String.class);
        JavaType IntegerIntegerMap = mapper.getTypeFactory().constructMapType(HashMap.class,Integer.class, Integer.class);
    }

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/
    public static <T> T unsearlize(String content,Class<T> type) throws SystemException {
        try
        {
            return   mapper.readValue(content, type);
        }
        catch (IOException e)
        {
            throw new SystemException("Json反序列化错误",e);
        }
    }

    public static <T> T unsearlize(String content, JavaType type) throws SystemException {
        try{
            return mapper.readValue(content, type);
        } catch (Exception e) {
            throw new SystemException("Json反序列化错误",e);
        }
    }


    public static <T> String searlize(T object) throws SystemException {
        try
        {
            return mapper.writeValueAsString(object);
        }
        catch (JsonProcessingException e)
        {
            throw new SystemException("Json序列化错误",e);
        }
    }

    public static JavaType constructParametricType(Class<?> clazz1, Class<?> clazz2, Class<?> clazz3){
        return mapper.getTypeFactory().constructParametrizedType(clazz1, clazz2, clazz3);
    }

    @SuppressWarnings("unchecked")
    public static <T> T readValue(String jsonString, Class<?> clazz) throws JsonParseException, JsonMappingException, IOException
    {
        return (T)mapper.readValue(jsonString, clazz);
    }
    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
